#include <stdio.h>
#include <math.h>

int add(int x,int y)
{
    return x+y;
}

int sub(int x,int y)
{
    return x-y;
}

int mul(int x,int y)
{
    return x*y;
}

int div(int x,int y)
{
    return x/y;
}

int mypow(int x,int y)
{
    return pow(x,y);
}

int main(int argc, char const *argv[])
{
/*    int (*pfunc)(int x,int y);
    pfunc = add;
    int ret = pfunc(10,5);
    printf("ret=%d\n",ret);

    pfunc = sub;
    ret = pfunc(10,5);
    printf("ret=%d\n",ret);

    pfunc = mul;
    ret = pfunc(10,5);
    printf("ret=%d\n",ret);

    pfunc = div;
    ret = pfunc(10,5);
    printf("ret=%d\n",ret);

    pfunc = mypow;
    ret = pfunc(10,5);
    printf("ret=%d\n",ret);

    int a[10]={0};
    printf("add  =%p\n",add);   //add是函数名，也是函数起始地址，同样是函数的地址
    printf("a    =%p\n",a);     //a  是数组名，也是数组起始地址，同样是数组的地址

    int (*pfunc)(int x,int y);  //定义一个函数类型的指针变量，用来保存函数名（函数的地址）
    pfunc = add;                //把函数名赋值给函数指针变量
    printf("pfunc=%p\n",pfunc); //输出pfunc变量中的值

    int *pa = a;                //定义一个整形指针变量，并把数组的地址赋值给pa
    printf("pa   =%p\n",pa);    //输出pa指针变量中的值
*/
    int (*pfunc[5])(int x,int y);   //定义一个数组，里面有5个元素，每一个元素都是一个函数指针变量
    pfunc[0] = add;
    pfunc[1] = sub;
    pfunc[2] = mul;
    pfunc[3] = div;
    pfunc[4] = mypow;

    for (int i = 0; i < 5; i++)
    {
        printf("pfunc[%d]=%p\n",i,pfunc[i]);
    }

    int a=10, b=5, ret=0;
    for (int i = 0; i < 5; i++)     //可以使用for循环来批量调用函数
    {
        //i=0， pfunc[0] = add,  相等于 add(a,b);
        //i=1， pfunc[1] = add,  相等于 sub(a,b);
        //i=2， pfunc[2] = add,  相等于 mul(a,b);
        //i=3， pfunc[3] = add,  相等于 div(a,b);
        //i=4， pfunc[4] = add,  相等于 mypow(a,b);
        
        ret = pfunc[i](a,b);
        printf("ret=%d\n",ret);
    }
    
    
    return 0;
}
